{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "# Mini Project 2: Movie Box Office Prediction Project\n",
    "\n",
    "## Introduction\n",
    "This project aims to provide students with a comprehensive understanding of **data analysis**, **feature engineering**, and building **prediction model** using Python. The following script integrates the various functionalities discussed in the provided code files.\n",
    "\n",
    "## Code Overview\n",
    "The code below is a Jupyter Notebook that combines functionalities from data exploration to building prediction models. You can work on each section independently, and then integrate them as a cohesive movie analysis and box office prediction model\n",
    "\n",
    "## Grading\n",
    "- Basic tasks (85%) - Submit the task notebook file to Moodle\n",
    "- Bouns task (20%) - Submit the prediction results to Kaggle"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Instructions for Students\n",
    "\n",
    "1. **Setup Environment:** Ensure you have all necessary libraries installed, including `pandas`, `sklearn`, `numpy`, and other dependencies required for running the above script. Install the libraries using:\n",
    "   ```bash\n",
    "   conda create -n cisc7201_mini02\n",
    "   conda activate cisc7201_mini02\n",
    "   conda install conda-forge::python=3.10 conda-forge::pandas conda-forge::numpy conda-forge::scikit-learn conda-forge::matplotlib  \n",
    "   ```\n",
    " \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Task 1 Exploring the Dataset (40%)\n",
    "\n",
    "- Extract the file to access all datasets located within the \"data\" folder, within the folder, there is one dataset in \"tmdb_5000_movies.csv\" file. Extract data from the CSV file to obtain information on movies.\n",
    "- Your task is to \n",
    " > 1) show some example data in the CSV file to see its data format.\n",
    " > 2) carefully examine the characteristics of each dimension of the data. For numerical dimensions, consider the scale of the values and whether there are any outliers. For categorical dimensions, think about how to utilize these categorical features.\n",
    " > 3) made a visual analysis of some features of the movie data to help the box office prediction and movie recommendation in the future."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "## Task 1.1 Loading data (10%)\n",
    "\n",
    "- Show some example data in the CSV file to see its data format.\n",
    "- Your task is to print the tail (5 items) of the data data_movies"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "      budget                                             genres  \\\n",
      "4601  220000  [{\"id\": 28, \"name\": \"Action\"}, {\"id\": 80, \"nam...   \n",
      "4602    9000  [{\"id\": 35, \"name\": \"Comedy\"}, {\"id\": 10749, \"...   \n",
      "4603       0  [{\"id\": 35, \"name\": \"Comedy\"}, {\"id\": 18, \"nam...   \n",
      "4604       0                                                 []   \n",
      "4605       0                [{\"id\": 99, \"name\": \"Documentary\"}]   \n",
      "\n",
      "                                               homepage      id  \\\n",
      "4601                                                NaN    9367   \n",
      "4602                                                NaN   72766   \n",
      "4603  http://www.hallmarkchannel.com/signedsealeddel...  231617   \n",
      "4604                        http://shanghaicalling.com/  126186   \n",
      "4605                                                NaN   25975   \n",
      "\n",
      "                                               keywords original_language  \\\n",
      "4601  [{\"id\": 5616, \"name\": \"united states\\u2013mexi...                es   \n",
      "4602                                                 []                en   \n",
      "4603  [{\"id\": 248, \"name\": \"date\"}, {\"id\": 699, \"nam...                en   \n",
      "4604                                                 []                en   \n",
      "4605  [{\"id\": 1523, \"name\": \"obsession\"}, {\"id\": 224...                en   \n",
      "\n",
      "                 original_title  \\\n",
      "4601                El Mariachi   \n",
      "4602                  Newlyweds   \n",
      "4603  Signed, Sealed, Delivered   \n",
      "4604           Shanghai Calling   \n",
      "4605          My Date with Drew   \n",
      "\n",
      "                                               overview  popularity  \\\n",
      "4601  El Mariachi just wants to play his guitar and ...   14.269792   \n",
      "4602  A newlywed couple's honeymoon is upended by th...    0.642552   \n",
      "4603  \"Signed, Sealed, Delivered\" introduces a dedic...    1.444476   \n",
      "4604  When ambitious New York attorney Sam is sent t...    0.857008   \n",
      "4605  Ever since the second grade when he first saw ...    1.929883   \n",
      "\n",
      "                                   production_companies  \\\n",
      "4601           [{\"name\": \"Columbia Pictures\", \"id\": 5}]   \n",
      "4602                                                 []   \n",
      "4603  [{\"name\": \"Front Street Pictures\", \"id\": 3958}...   \n",
      "4604                                                 []   \n",
      "4605  [{\"name\": \"rusty bear entertainment\", \"id\": 87...   \n",
      "\n",
      "                                   production_countries release_date  revenue  \\\n",
      "4601  [{\"iso_3166_1\": \"MX\", \"name\": \"Mexico\"}, {\"iso...   1992-09-04  2040920   \n",
      "4602                                                 []   2011-12-26        0   \n",
      "4603  [{\"iso_3166_1\": \"US\", \"name\": \"United States o...   2013-10-13        0   \n",
      "4604  [{\"iso_3166_1\": \"US\", \"name\": \"United States o...   2012-05-03        0   \n",
      "4605  [{\"iso_3166_1\": \"US\", \"name\": \"United States o...   2005-08-05        0   \n",
      "\n",
      "      runtime                               spoken_languages    status  \\\n",
      "4601     81.0  [{\"iso_639_1\": \"es\", \"name\": \"Espa\\u00f1ol\"}]  Released   \n",
      "4602     85.0                                             []  Released   \n",
      "4603    120.0       [{\"iso_639_1\": \"en\", \"name\": \"English\"}]  Released   \n",
      "4604     98.0       [{\"iso_639_1\": \"en\", \"name\": \"English\"}]  Released   \n",
      "4605     90.0       [{\"iso_639_1\": \"en\", \"name\": \"English\"}]  Released   \n",
      "\n",
      "                                                tagline  \\\n",
      "4601  He didn't come looking for trouble, but troubl...   \n",
      "4602  A newlywed couple's honeymoon is upended by th...   \n",
      "4603                                                NaN   \n",
      "4604                           A New Yorker in Shanghai   \n",
      "4605                                                NaN   \n",
      "\n",
      "                          title  vote_average  vote_count  \n",
      "4601                El Mariachi           6.6         238  \n",
      "4602                  Newlyweds           5.9           5  \n",
      "4603  Signed, Sealed, Delivered           7.0           6  \n",
      "4604           Shanghai Calling           5.7           7  \n",
      "4605          My Date with Drew           6.3          16  \n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "data_movies = pd.read_csv('data/tmdb_5000_movies_train.csv')\n",
    "# Print the tail (5 items) of the data, write the codes here\n",
    "print(data_movies.tail())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Task 1.2 Data Preprocessing (10%)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- For reference of data processing, note that the release_date column is stored as a string in the format of year, month, and day (e.g., YYYY-MM-DD).  you can use the following code to convert it into a numeric timestamp (Unix timestamp).\n",
    "- Your task here is to identifying missing values and fill missing values using the mean, median, or other suitable methods\n",
    "- Hint: you could refer to [fillna()](https://www.w3schools.com/python/pandas/ref_df_fillna.asp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\NH50AF\\AppData\\Local\\Temp\\ipykernel_7884\\2931543520.py:9: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
      "The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
      "\n",
      "For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
      "\n",
      "\n",
      "  data_movies['revenue'].fillna(data_movies['revenue'].mean(), inplace=True)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>release_data</th>\n",
       "      <th>revenue</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4601</th>\n",
       "      <td>715564800</td>\n",
       "      <td>2040920</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4602</th>\n",
       "      <td>1324857600</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4603</th>\n",
       "      <td>1381622400</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4604</th>\n",
       "      <td>1336003200</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4605</th>\n",
       "      <td>1123200000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      release_data  revenue\n",
       "4601     715564800  2040920\n",
       "4602    1324857600        0\n",
       "4603    1381622400        0\n",
       "4604    1336003200        0\n",
       "4605    1123200000        0"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Convert the date into a numerical timestamp format\n",
    "def process_release_date(data_movies):\n",
    "    data_movies['release_date'] = pd.to_datetime(data_movies['release_date'], format='%Y-%m-%d', errors='coerce')\n",
    "    data_movies['release_data'] = data_movies['release_date'].astype('int64') // 10**9\n",
    "    \n",
    "process_release_date(data_movies)\n",
    "# Filling missing values for revenue\n",
    "# Your code starts here\n",
    "data_movies['revenue'].fillna(data_movies['revenue'].mean(), inplace=True)\n",
    "\n",
    "# Print the tail\n",
    "data_movies[['release_data', 'revenue']].tail()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Task 1.3 Visualization of the dataset (20%)\n",
    "- You need to visually analyze the relationship between some features of movie data and revenue, so as to help future box office prediction.\n",
    "- An example is provided below to generate a scatter plot between budget and revenue"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwAAAAHTCAYAAACQtH8mAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC3wklEQVR4nOzde1wUVf8H8M+y3AVM0bywIGreyjLTSkgMU7xkRiGPlualLCsrQVO7+DypZVpaCllalqVZmIZYkaahiaKYpdnFIvMCIgiZWAKKgLvz+4PfbHvfM7MzO7O73/fv1ev3uMzOnj27O3Mu3/M9Go7jOBBCCCGEEEJ8gp/SBSCEEEIIIYS4D3UACCGEEEII8SHUASCEEEIIIcSHUAeAEEIIIYQQH0IdAEIIIYQQQnwIdQAIIYQQQgjxIdQBIIQQQgghxIdQB4AQQgghhBAfQh0AQgghhBBCfAh1AAghqlRSUgKNRoMff/xRFedxZtKkSbjnnntkfQ3iOxITE5Genm737/PmzcONN94oy2vHxsYiIyNDlnMTQtSBOgCEEMlNmjQJGo0GGo0G/v7+iImJweOPP46///5b9te1bIRHR0ejoqICPXv2lPW1pZCfnw+NRoN//vlH6aIQIinqIBOiLtQBIITIYtiwYaioqEBJSQnee+895ObmYurUqW4vh1arRdu2beHv7+/21/ZlHMfhypUrSheDEEKIDdQBIITIIigoCG3btoVOp8OQIUMwZswYfP3112bHfPDBB+jRoweCg4PRvXt3rFixwu759Ho9Jk+ejI4dOyIkJATdunVDZmam8e/z5s3D2rVr8fnnnxtnH/Lz822GAO3evRu33HILgoKC0K5dOzz77LNmjdXExERMmzYNs2fPRsuWLdG2bVvMmzeP6X3Pnz8fV199NSIiIvDoo4+ioaHB+DeO47B48WJ06tQJISEh6NWrF7KzswE0hSoNHDgQANCiRQtoNBpMmjQJubm5uOqqq2AwGAAAP/74IzQaDWbNmmU876OPPor777/f+O/CwkIMGDAAISEhiI6OxrRp03Dx4kXj3xsaGjB79mxERUWhWbNmuPXWW5Gfn2/8+5o1a3DVVVdh+/bt6NGjB8LCwowdOnv42Yvt27ejb9++CAoKQkFBgcP3bDAYoNPp8Pbbb5ud64cffoBGo8HJkycBABcuXMCUKVOM9XrHHXfgp59+Mh7Ph8OsW7cOsbGxaN68Oe677z7U1NQYj7EV1nLjjTeafa7OXseWZ555Bl27dkVoaCg6deqE//3vf2hsbBRUtosXL2LChAkICwtDu3bt8Prrrzt8TVPvvPMOoqOjERoaiv/85z9ms0e2wojuueceTJo0yfjvs2fPYuTIkQgJCUHHjh3x8ccfW73G77//jv79+yM4OBjXXnstduzYAY1Gg88++8x4THl5OcaMGYMWLVogMjISycnJKCkpMdaBrd8mIUQ51AEghMju5MmT2LZtGwICAoyPvfvuu5gzZw5efvllFBUVYeHChfjf//6HtWvX2jwH31jcuHEjfvvtN7zwwgt4/vnnsXHjRgDAzJkzMXr0aGNDtaKiAvHx8VbnKS8vx5133ombb74ZP/30E1auXInVq1djwYIFZsetXbsWzZo1w4EDB7B48WK8+OKLyMvLc/g+d+7ciaKiIuzatQvr16/H5s2bMX/+fOPf//vf/+KDDz7AypUr8euvv2L69Ol44IEHsHv3bkRHR2PTpk0AgKNHj6KiogKZmZkYMGAAampqcPjwYQBNnZdWrVph9+7dxvPm5+fj9ttvBwD88ssvGDp0KFJSUvDzzz9jw4YN2Lt3L5588knj8Q8++CD27duHTz75BD///DP+85//YNiwYTh27JjxmEuXLuG1117DunXrsGfPHpSWlmLmzJkO3z8AzJ49G4sWLUJRURFuuOEGh+/Zz88P9913n1WjMysrC3FxcejUqRM4jsOIESNQWVmJrVu34tChQ7jpppswaNAgnD9/3vicEydO4LPPPsOXX36JL7/8Ert378Yrr7zitLw81texFB4ejjVr1uC3335DZmYm3n33XSxbtszsGGdlmzVrFnbt2oXNmzfj66+/Rn5+Pg4dOuS0zMePH8fGjRuRm5uLbdu24ccff8QTTzzB/J6BptCckpISfPPNN8jOzsaKFStw9uxZ498NBgPuuecehIaG4sCBA1i1ahXmzJljdo5Lly5h4MCBCAsLw549e7B3715jp7GhoYH5t0kIcSPOh+3evZu76667uHbt2nEAuM2bNws+x4YNG7hevXpxISEhXExMDLd48WLpC0qIh5k4cSKn1Wq5Zs2accHBwRwADgC3dOlS4zHR0dFcVlaW2fNeeuklLi4ujuM4jisuLuYAcIcPH7b7OlOnTuVGjRpl9rrJ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",
      "text/plain": [
       "<Figure size 900x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "## load data\n",
    "x1 = np.array(data_movies[\"budget\"])\n",
    "y1 = np.array(data_movies[\"revenue\"])\n",
    "\n",
    "fig = plt.figure(1, figsize=(9, 5))\n",
    "\n",
    "plt.scatter(x1, y1, c=['green'], marker='o')\n",
    "plt.grid()\n",
    "plt.xlabel(\"budget\", fontsize=10)\n",
    "plt.ylabel(\"revenue\", fontsize=10)\n",
    "plt.title(\"Relation between revenue and budget\", fontsize=10)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  Your task is to provide visual analysis of other attributes in relation to revenue to aid in feature selection for movie box office (revenue) prediction. \n",
    "- You can use other type of plots such as [scatter](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html), [bar](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.bar.html), [line](https://www.w3schools.com/python/matplotlib_line.asp), etc."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwAAAAHTCAYAAACQtH8mAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABtAElEQVR4nO3deXhU1f3H8c8QshA22WRJIsEd64bgEjQSrEBRKTYqKMiioFJUiFEUtRVwAVeMtqJFURQFKRhFWqqklmAENxBcCgVBEIhBCCphM4Tk/P64vxkyyewzmUlm3q/n4Rnnzrn3nhmOer7nnvM9NmOMEQAAAICY0CjSFQAAAAAQPgQAAAAAQAwhAAAAAABiCAEAAAAAEEMIAAAAAIAYQgAAAAAAxBACAAAAACCGEAAAAAAAMYQAAAAAAIghBAAAwmbr1q2y2Wxau3ZtvbiONyNHjtSVV15Zp/dA7MjKylJOTk6kq+GTyZMn6+yzzw76OoWFhbLZbPrll1+CvhaA0CEAAOCTkSNHymazyWazqXHjxjruuOP0xz/+UT///HOd37dmJzwtLU0lJSU6/fTT6/TeoUAHCLGsZ8+eKikpUcuWLSVJs2fP1jHHHBPZSgEgAADgu9/97ncqKSnR1q1b9dJLL2nx4sUaO3Zs2OsRFxenDh06qHHjxmG/dywzxujIkSORrgYaiIqKCiUkJKhDhw6y2WyRrg6AaggAAPgsMTFRHTp0UGpqqvr27avBgwdr6dKlTmVeeeUVde3aVUlJSTr11FM1Y8YMt9errKzUqFGj1KVLFzVp0kSnnHKKnnnmGcfnkydP1quvvqpFixY5nj4UFha6nAK0fPlynXfeeUpMTFTHjh01ceJEp85qVlaWxo0bp7vvvlutW7dWhw4dNHnyZJ++95QpU3TssceqRYsWuuWWW3T48GHHZ8YYPf744zr++OPVpEkTnXXWWVq4cKEka6pS7969JUmtWrWSzWbTyJEjtXjxYh1zzDGqqqqSJK1du1Y2m00TJkxwXPeWW27Rdddd53i/cuVKXXzxxWrSpInS0tI0btw4HThwwPH54cOHdffddyslJUVNmzbV+eefr8LCQsfn9pHX999/X127dlWzZs0cAZ079qcX77//vnr06KHExEQVFRV5/M5VVVVKTU3VCy+84HStL774QjabTd99950kae/evbr55psdv+sll1yiL7/80lHePgVlzpw5Sk9PV8uWLXXttddq3759jjLp6enKy8tzus/ZZ5/t9Pfq7T6u3HPPPTr55JOVnJys448/Xn/+859VUVHhV90OHDig4cOHq1mzZurYsaOeeuopj/esft2//e1vSktLU3Jysq655hqnp0dVVVV68MEHlZqaqsTERJ199tl67733HJ/b/91488031bNnTyUlJek3v/mNy7ZQ3TvvvOOxk/7555+rT58+atu2rVq2bKlevXrpiy++cCpjs9n0wgsvaODAgWratKkefvhhpydghYWFuuGGG7R3717Hv8+TJ0/Wgw8+qDPOOKPWPbt3764HHnjA6+8GIAAGAHwwYsQIM3DgQMf7zZs3m9NOO820b9/ecWzmzJmmY8eO5q233jLfffedeeutt0zr1q3N7NmzjTHGbNmyxUgya9asMcYYc/jwYfPAAw+Yzz77zHz33Xfm9ddfN8nJyWb+/PnGGGP27dtnBg0aZH73u9+ZkpISU1JSYsrLy2tdZ8eOHSY5OdmMHTvWrF+/3rz99tumbdu2ZtKkSY669erVy7Ro0cJMnjzZbNy40bz66qvGZrOZpUuXevzOzZo1M4MHDzbffPON+cc//mHatWtn7rvvPkeZ++67z5x66qnmvffeM5s3bzavvPKKSUxMNIWFhebIkSPmrbfeMpLMhg0bTElJifnll1/ML7/8Yho1amRWrVpljDEmLy/PtG3b1px77rmO65588snm+eefN8YY89VXX5lmzZqZp59+2mzcuNGsWLHCdOvWzYwcOdJRfsiQIaZnz57mww8/NJs2bTJPPPGESUxMNBs3bjTGGPPKK6+Y+Ph4c+mll5rPP//crF692nTt2tUMGTLE7fdftmyZkWTOPPNMs3TpUrNp0yZTWlrq8TsbY8ydd95pLrroIqdr3XnnnSYjI8MYY0xVVZW58MILzYABA8znn39uNm7caO68807Tpk0bs2fPHmOMMZMmTTLNmjUz2dnZ5uuvvzYffvih6dChg9Nv37lzZ/P000873eess85y/L37ch9XHnroIbNixQqzZcsW8+6775r27dubxx57zPG5L3X74x//aFJTU83SpUvNV199Za644grTrFkzM378eLf3nTRpkmnatKm55JJLzJo1a8zy5cvNiSee6PR3NH36dNOiRQszb94887///c/cfffdJj4+3vH3bP93IzU11SxcuNCsW7fOjB492jRv3tyUlpYaY6y20LJlS6d7v/3226Z6l2DSpEnmrLPOcrz/4IMPzJw5c8y6devMunXrzKhRo0z79u1NWVmZo4wkc+yxx5pZs2aZzZs3m61btzra0M8//2zKy8tNXl6eadGihePf53379pnt27ebRo0amc8++8xxrS+//NLYbDazefNmt78XgMDFdACwfPlyc8UVV5iOHTsaSebtt9/2+xrz5883Z511lmnSpIk57rjjzOOPPx76igL1wIgRI0xcXJxp2rSpSUpKMpKMJDN9+nRHmbS0NDN37lyn8x566CFHx69mx92VsWPHmquuusrpvtUDD1fXue+++8wpp5xiqqqqHGWee+4506xZM1NZWWmMsQKAmp3Sc88919xzzz0ev3Pr1q3NgQMHHMeef/55x3X3799vkpKSzMqVK53OGzVqlLnuuuuMMcapA1TdOeecY5588kljjDFXXnmleeSRR0xCQoIpKyszJSUlRpJZv369McaYYcOGmZtvvtnp/KKiItOoUSNz6NAhs2nTJmOz2UxxcbFTmd/+9rfm3nvvNcZYnT5JZtOmTU6/UfUAriZ73d955x3HMV++8xdffGFsNpvZunWrMcaYyspKk5KSYp577jljjNWZbNGihfn111+drnHCCSeYv/3tb8YYqwOanJzs1MGcMGGCOf/88x3vvQUAvtzHF48//rjp3r274723uu3bt88kJCSYN9980/H5nj17TJMmTbwGAHFxcWb79u2OY//6179Mo0aNTElJiTHGmE6dOplHHnnE6bxzzz3XjB071hhz9N+NRx991PF5RUWFSU1NdQQxgQQANR05csQ0b97cLF682HFMksnJyXEqV7P9u7q3Mcb079/f/PGPf3S8z8nJMVlZWW7vDyA4MT2B9sCBAzrrrLN0ww036KqrrvL7/H/9618aOnSo/vKXv6hv375av369Ro8erSZNmui2226rgxoDkdW7d289//zzOnjwoF566SVt3LhRt99+uyRp9+7d2r59u0aNGqWbbrrJcc6RI0ccCwBdeeGFF/TSSy/p+++/16FDh3T48GG/s4+sX79eGRkZTlMYLrzwQu3fv187duzQcccdJ0k688wznc7r2LGjdu3a5fHaZ511lpKTkx3vMzIytH//fm3fvl27du3Sr7/+qj59+jidc/jwYXXr1s3jdbOyslRYWKjc3FwVFRXp4Ycf1ltvvaWPPvpIv/zyi9q3b69TTz1VkrR69Wpt2rRJb7zxhuN8Y4yqqqq0ZcsWffPNNzLG6OSTT3a6R3l5udq0aeN4n5ycrBNOOMGv7y9JPXr0cPzzunXrvH7nbt266dRTT9W8efM0ceJELV++XLt27dKgQYMc32f//v1OdZOkQ4cOafPmzY736enpat68ud/1tfP1PjUtXLhQeXl52rRpk/bv368jR46oRYsWTmU81W3z5s06fPiwMjIyHJ+3bt1ap5xyitc6H3fccUpNTXW8z8jIUFVVlTZs2KDk5GT98MMPuvDCC53OufDCC2tNa6p+78aNG6tHjx5av3691/u7s2vXLj3wwAP6z3/+ox9//FGVlZU6ePCgtm3b5lSuelvxx0033aQbb7xR06dPV1xcnN544w2fpk0BCExMBwD9+/dX//793X5++PBh/elPf9Ibb7yhX375Raeffroee+wxZWVlSZLmzJmjK6+8UmPGjJEkHX/88brnnnv02GOP6dZbb2XRE6JO06ZNdeKJJ0qSnn32WfXu3VtTpkzRQw895JjP/uKLL+r88893Oi8uLs7l9f7+97/rjjvu0FNPPaWMjAw1b95cTzzxhD799FO/6mWMqfXvmzFGkpyOx8fHO5Wx2WyOevur+rn//Oc/lZKS4vR5YmKix/OzsrI0a9Ysffnll2rUqJFOO+009erVS8uXL9fPP/+sXr16OcpWVVXplltu0bhx42pd57jjjtNXX32luLg4rV69utZv3axZM8c/u/r+9t/Jk6ZNmzrVRfL+nYcOHaq5c+dq4sSJmjt3rvr166e2bds6rtGxY0eneel21eeme/v7atSoUa36V5+r7+t9qvvkk0907bXXasqUKerXr59atmypN998s1Zn1FPdfPlNfWVvv9Xbsau27sv/b+xlvP1urowcOVK7d+9WXl6eOnfurMTERGVkZDith5Gc24o/BgwYoMTERL399ttKTExUeXl5QANzAHwT0wGANzfccIO2bt2qN998U506ddLbb7+t3/3ud/r666910kknqby83GlkUJKaNGmiHTt26Pvvv1d6enpkKg6EyaRJk9S/f3/98Y9/VKdOnZSSkqLvvvtOQ4cO9en8oqIi9ezZ0ymTUM2R2YSEBFVWVnq8zmmnnaa33nrLqSO0cuVKNW/evFYn1V9ffvmlDh06pCZNmkiyOojNmjVTamqqWrVqpcTERG3bts2pw16z/pJqfYeLL75Y+/btU15ennr16iWbzaZevXpp2rRp+vnnnzV+/HhH2XPOOUf//e9/HcFXTd26dVNlZaV27dqlzMzMoL6vN6eddprX7yxJQ4YM0Z/+9CetXr1aCxcu1PPPP+/47JxzztHOnTvVuHHjoP472a5dO6dFzGVlZdqyZUtQ91mxYoU6d+6s+++/33Hs+++/96teJ554ouLj4/XJJ584nj79/PPP2rhxo8ffTJK2bdumH374QZ06dZIkffzxx2rUqJFOPvlktWjRQp06ddJHH32kiy++2HHOypUrdd555zld55NPPnGUOXLkiFavXu14Mt2uXTvt27dPBw4ccHTYve2pUVRUpBkzZuiyyy6TJG3fvl2lpaU+/iJHufv3uXHjxhoxYoReeeUVJSYm6tprr631/1cAoUMWIDc2b96sefPmacGCBcrMzNQJJ5ygu+66SxdddJFeeeUVSVK/fv2Un5+vDz74QFVVVdq4caMjI4WnzBpAtMjKytJvfvMbTZ06VZKVxWTatGl65plntHHjRn399dd65ZVXNH36dJfnn3jiiVq1apXef/99bdy4UX/+85/1+eefO5VJT0/XV199pQ0bNqi0tNTlSOXYsWO1fft23X777frf//6nRYsWadKkScrNzVWjRsH9Z+7w4cMaNWqU1q1bp3/961+aNGmSbrvtNjVq1EjNmzfXXXfdpTvuuEOvvvqqNm/erDVr1ui5557Tq6++Kknq3LmzbDab/vGPf2j37t3av3+/JKlly5Y6++yz9frrrzueKl588cX64osvtHHjRscxycpK8/HHH+vWW2/V2rVr9e233+rdd991TL86+eSTNXToUA0fPlz5+fnasmWLPv/8cz322GNasmRJUN+/Jl++syR16dJFPXv21KhRo3TkyBENHDjQ8dmll16qjIwMXXnllXr//fe1detWrVy5Un/605+0atUqn+tyySWXaM6cOSoqKtI333yjESNGOD0BCeQ+J554orZt26Y333xTmzdv1rPPPqu3337br9+oWbNmGjVqlCZMmKAPPvhA33zzjUaOHOlTW0xKStKIESP05ZdfqqioSOPGjdOgQYPUoUMHSdKECRP02GOPaf78+dqwYYMmTpyotWvXOgWMkvTcc8/p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1W+Vl8dvBQBAXQpoCtCAAQM0f/58LVmyRDabTQ888IDWr1+vxYsXq0+fPqGuY9QKx0ZIdT0Xn5SOR5Hb3j+kYgUAIDICegIgSf369VO/fv1CWZeYsnhx+EbN63K01Z9FxllZgd+nvvMWCNlsViA0cCBTW6qzLyIHAADhw07AEXLPPeEdNa+r0VZSOlrIbQ8AABqKgJ4ANGrUSDZ3KTwkVcbCfI8gFRe7/yxUo+au1heEerSVlI4WAiEAANBQBBQAvP32207vKyoqtGbNGr366quaMmVKSCoG3zuLrjr6ixb5thg12EXI4Vhk3BAQCAEAgIYioABg4MCBtY5dffXV+s1vfqP58+dr1KhRQVcMvnUWXWWdadNG2rOndtma6wtCkbGGlI4WAiEAANBQhHQNwPnnn69///vfobxk1EpJCX4jJHdZZ1x1/iXn9QULFoQuY419kXEsb/jFzscAAKChCFkAcOjQIf3lL39RampqqC4Z1R57zHoNtLPoKeuMJ/b1BWPHhnYRsq+LjGvuFhxNy0UIhAAAQEMQUADQqlUrtW7d2vGnVatWat68uV5++WU98cQTfl1rxowZ6tKli5KSktS9e3cVeUmTUl5ervvvv1+dO3dWYmKiTjjhBL388suBfI2IGjAguM6it6wz3pSWuv8s0Iw19pSO111nvdYMYMKx70GkkdseAADUdwGtAcjLy3N636hRI7Vr107nn3++WrVq5fN15s+fr5ycHM2YMUMXXnih/va3v6l///5at26djjvuOJfnDBo0SD/++KNmzZqlE088Ubt27dKRI0cC+RoRl51t5YUPZBFuOLLJhPIesbRbMLntAQBAfRZQADBixIiQ3Hz69OkaNWqURo8eLckKLN5//309//zzmjZtWq3y7733npYvX67vvvtOrVu3liSlp6eHpC6REmhnMdBsMjab1LattHt33d2jpkA3yQo2QxEAAABqC3gn4F9++UWfffaZdu3apaqqKqfPhg8f7vX8w4cPa/Xq1Zo4caLT8b59+2rlypUuz3n33XfVo0cPPf7445ozZ46aNm2q3//+93rooYfUpEkTl+eUl5ervLzc8b6srEySlbq0oqLCaz1DzX7PYO99wQXSiSdKP/zg+zoA+/qCGTOke+91f67NZk1NuuACyV7Nykrp44+lnTulDh2kjAzfO+MffWQtTHbzVyTJmpL04YfSRRdZ7xcvtjZLq75fQkqKtXZiwADf7hutQtWGELtoQwgWbQjBoP3UHV9/U5sx/i4jlRYvXqyhQ4fqwIEDat68udOmYDabTT/99JPXa/zwww9KSUnRihUr1LNnT8fxqVOn6tVXX9WGDRtqnfO73/1OhYWFuvTSS/XAAw+otLRUY8eO1SWXXOJ2HcDkyZNd7k0wd+5cJScn+/J1AQAAgHrv4MGDGjJkiPbu3asWLVq4LRfQE4A777xTN954o6ZOnRp0J7rmjsLGGLe7DFdVVclms+mNN95Qy5YtJVnTiK6++mo999xzLp8C3HvvvcrNzXW8LysrU1pamvr27evxh6krFRUVKigoUJ8+fRQfHx/09VyNlKemSo8+Kl12medRe0/n2kfZFy+Whg2r/aTA/lc0Z473EfmPPpIuv9z7d/nnP606nnGG+52S7U8nvvoqdqcDhboNIfbQhhAs2hCCQfupO/aZLt4EFAAUFxdr3LhxQXX+27Ztq7i4OO3cudPp+K5du9S+fXuX53Ts2FEpKSmOzr8kde3aVcYY7dixQyeddFKtcxITE5WYmFjreHx8fEQbXaju720hce/ers+rrJRat5YmT7bWA7RrZ3Wsq59rn7t/8KDra7ibu1/TxRdbm5N52yTr4out77Fpk+fv/O230iefsNA20m0YDR9tCMGiDSEYtJ/Q8/X3DCgNaL9+/bRq1apATnVISEhQ9+7dVVBQ4HS8oKDAaUpQdRdeeKF++OEH7d+/33Fs48aNatSoUUzvP+At/WZNCxZYTwR695auv1664w5p4kTpp5+cz/WWatTXdKG+bpIlSR984PladuHIggQAABCNAnoCcPnll2vChAlat26dzjjjjFrRxu9//3ufrpObm6thw4apR48eysjI0MyZM7Vt2zaNGTNGkjV9p7i4WK+99pokaciQIXrooYd0ww03aMqUKSotLdWECRN04403ul0EDGd33y252qphx47a6Th97WT7Us6+Sdb48c5BRWrq0c5/errvexuEKkMRAABArAkoALjpppskSQ8++GCtz2w2myp93N518ODB2rNnjx588EGVlJTo9NNP15IlS9S5c2dJUklJibZt2+Yo36xZMxUUFOj2229Xjx491KZNGw0aNEgPP/xwIF8j5ixc6Lrzb2eM85QeXzvZvpZzN11p0SLXewS4Yp8ulJnp2z0B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yVGGNgRPHn74YdOmTRvzj3/8w2zZssUsWLDANGvWzOTl5TnK0IbqDwKAMDrvvPPMmDFjnI6deuqpZuLEiRGqEeqrXbt2GUlm+fLlxhhjqqqqTIcOHcyjjz7qKPPrr7+ali1bmhdeeMEYY8wvv/xi4uPjzZtvvukoU1xcbBo1amTee++98H4BRMS+ffvMSSedZAoKCkyvXr0cAQDtB97cc8895qKLLnL7OW0I3lx++eXmxhtvdDqWnZ1trr/+emMMbai+YQpQmBw+fFirV69W3759nY737dtXK1eujFCtUF/t3btXktS6dWtJ0pYtW7Rz506n9pOYmKhevXo52s/q1atVUVHhVKZTp046/fTTaWMx4tZbb9Xll1+uSy+91Ok47QfevPvuu+rRo4euueYaHXvsserWrZtefPFFx+e0IXhz0UUX6YMPPtDGjRslSV9++aU++ugjXXbZZZJoQ/VN40hXIFaUlpaqsrJS7du3dzrevn177dy5M0K1Qn1kjFFubq4uuuginX766ZLkaCOu2s/333/vKJOQkKBWrVrVKkMbi35vvvmmvvjiC33++ee1PqP9wJvvvvtOzz//vHJzc3Xffffps88+07hx45SYmKjhw4fThuDVPffco7179+rUU09VXFycKisr9cgjj+i6666TxH+H6hsCgDCz2WxO740xtY4htt1222366quv9NFHH9X6LJD2QxuLftu3b9f48eO1dOlSJSUluS1H+4E7VVVV6tGjh6ZOnSpJ6tatm/773//q+eef1/Dhwx3laENwZ/78+Xr99dc1d+5c/eY3v9HatWuVk5OjTp06acSIEY5ytKH6gSlAYdK2bVvFxcXVimB37dpVKxpG7Lr99tv17rvvatmyZUpNTXUc79ChgyR5bD8dOnTQ4cOH9fPPP7stg+i0evVq7dq1S927d1fjxo3VuHFjLV++XM8++6waN27s+Pun/cCdjh076rTTTnM61rVrV23btk0S/w2CdxMmTNDEiRN17bXX6owzztCwYcN0xx13aNq0aZJoQ/UNAUCYJCQkqHv37iooKHA6XlBQoJ49e0aoVqgvjDG67bbblJ+fr//85z/q0qWL0+ddunRRhw4dnNrP4cOHtXz5ckf76d69u+Lj453KlJSU6JtvvqGNRbnf/va3+vrrr7V27VrHnx49emjo0KFau3atjj/+eNoPPLrwwgtrpR7euHGjOnfuLIn/BsG7gwcPqlEj525lXFycIw0obaieidDi45hkTwM6a9Yss27dOpOTk2OaNm1qtm7dGumqIcL++Mc/mpYtW5rCwkJTUlLi+HPw4EFHmUcffdS0bNnS5Ofnm6+//tpcd911LtOnpaammn//+9/miy++MJdccgnp02JU9SxAxtB+4Nlnn31mGjdubB555BHz7bffmjfeeMMkJyeb119/3VGGNgRPRowYYVJSUhxpQPPz803btm3N3Xff7ShDG6o/CADC7LnnnjOdO3c2CQkJ5pxzznGkeURsk+TyzyuvvOIoU1VVZSZNmmQ6dOhgEhMTzcUXX2y+/vprp+scOnTI3HbbbaZ169amSZMm5oorrjDbtm0L87dBfVAzAKD9wJvFixeb008/3SQmJppTTz3VzJw50+lz2hA8KSsrM+PHjzfHHXecSUpKMscff7y5//77TXl5uaMMbaj+sBljTCSfQAAAAAAIH9YAAAAAADGEAAAAAACIIQQAAAAAQAwhAAAAAABiCAEAAAAAEEMIAAAAAIAYQgAAAAAAxBACAAAAACCGEAAAAOpUVlaWcnJygr7O5MmTdfbZZwd9HQCIdQQAAIAG4a677tIHH3zgeD9y5EhdeeWVkasQADRQjSNdAQAAPDHGqLKyUs2aNVOzZs0iXR0AaPB4AgAAUSorK0u33XabbrvtNh1zzDFq06aN/vSnP8kYI0n6+eefNXz4cLVq1UrJycnq37+/vv32W8f5s2fP1jHHHKN33nlHJ598spKSktSnTx9t377dUcbVKHxOTo6ysrLc1uv1119Xjx491Lx5c3Xo0EFDhgzRrl27HJ8XFhbKZrPp/fffV48ePZSYmKiioiKnKUCTJ0/Wq6++qkWLFslms8lms6mwsFCXXHKJbrvtNqf77dmzR4mJifrPf/4T4C8JANGFAAAAotirr76qxo0b69NPP9Wzzz6rp59+Wi+99JIkq/O+atUqvfvuu/r4449ljNFll12miooKx/kHDx7UI488oldffVUrVqxQWVmZrr322qDqdPjwYT300EP68ssv9c4772jLli0aOXJkrXJ33323pk2bpvXr1+vMM890+uyuu+7SoEGD9Lvf/U4lJSUqKSlRz549NXr0aM2dO1fl5eWOsm+88YY6deqk3r17B1VvAIgWTAECgCiWlpamp59+WjabTaeccoq+/vprPf3008rKytK7776rFStWqGfPnpKsjnJaWpreeecdXXPNNZKkiooK/fWvf9X5558vyQoounbtqs8++0znnXdeQHW68cYbHf98/PHH69lnn9V5552n/fv3O03xefDBB9WnTx+X12jWrJmaNGmi8vJydejQwXH8qquu0u23365FixZp0KBBkqRXXnlFI0eOlM1mC6i+ABBteAIAAFHsggsucOr4ZmRk6Ntvv9W6devUuHFjR8dektq0aaNTTjlF69evdxxr3LixevTo4Xh/6qmn6phjjnEq4681a9Zo4MCB6ty5s5o3b+6YLrRt2zanctXv66vExERdf/31evnllyVJa9eu1ZdffunyCQMAxCoCAACAgzGm1ki5q5Fz+7FGjRo51hTYVZ9CVNOBAwfUt29fNWvWTK+//ro+//xzvf3225KsqUHVNW3aNKDvMHr0aBUUFGjHjh16+eWX9dvf/ladO3cO6FoAEI0IAAAgin3yySe13p900kk67bTTdOTIEX366aeOz/bs2aONGzeqa9eujmNHjhzRqlWrHO83bNigX375RaeeeqokqV27diopKXG6x9q1a93W53//+59KS0v16KOPKjMzU6eeeqrTAmB/JCQkqLKystbxM844Qz169NCLL76ouXPnOk05AgAQAABAVNu+fbtyc3O1YcMGzZs3T3/5y180fvx4nXTSSRo4cKBuuukmffTRR/ryyy91/fXXKyUlRQMHDnScHx8fr9tvv12ffvqpvvjiC91www264IILHPP/L7nkEq1atUqvvfaavv32W02aNEnffPON2/ocd9xxSkhI0F/+8hd99913evfdd/XQQw8F9N3S09P11VdfacOGDSotLXV68jB69Gg9+uijqqys1B/+8IeArg8A0YoAAACi2PDhw3Xo0CGdd955uvXWW3X77bfr5ptvlmQtju3evbuuuOIKZWRkyBijJUuWKD4+3nF+cnKy7rnnHg0ZMkQZGRlq0qSJ3nzzTcfn/fr105///GfdfffdOvfcc7Vv3z4NHz7cbX3atWun2bNna8GCBTrttNP06KOP6sknnwzou91000065ZRT1KNHD7Vr104rVqxwfHbdddepcePGGjJkiJKSkgK6PgBEK5upOXkTABAVsrKydPbZZysvLy+g82fPnq2cnBz98ssvIa1XOGzfvl3p6en6/PPPdc4550S6OgBQr5AGFAAQNSoqKlRSUqKJEyfqggsuoPMPAC4wBQgAEDVWrFihzp07a/Xq1XrhhRciXR0AqJeYAgQAAADEEJ4AAAAAADGEAAAAAACIIQQAAAAAQAwhAAAAAABiCAEAAAAAEEMIAAAAAIAYQgAAAAAAxBACAAAAACCG/B8U/s8G8JWOygAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 900x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Write your code here\n",
    "# Scatter plot between popularity and revenue\n",
    "x2 = np.array(data_movies[\"popularity\"])\n",
    "y2 = np.array(data_movies[\"revenue\"])\n",
    "\n",
    "fig = plt.figure(2, figsize=(9, 5))\n",
    "\n",
    "plt.scatter(x2, y2, c=['blue'], marker='o')\n",
    "plt.grid()\n",
    "plt.xlabel(\"popularity\", fontsize=10)\n",
    "plt.ylabel(\"revenue\", fontsize=10)\n",
    "plt.title(\"Relation between revenue and popularity\", fontsize=10)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Task 2 Feature Engineering (45%)\n",
    "\n",
    "## Task 2.1: Feature Conversion(15%)\n",
    "\n",
    "- All features need to be converted into numerical format for computational analysis. Below is an example demonstrating how the genres column can be transformed using multi-hot encoding.\n",
    "\n",
    "#### Why Multi One-Hot Encoding?\n",
    "- Multi one-hot encoding is a method used to represent categorical features that can take on multiple values for each instance, such as genres and keywords. In our dataset, each movie can belong to multiple genres and have multiple keywords. By using multi one-hot encoding, we create binary columns representing each possible genre or keyword, with a value of 1 indicating its presence in a particular movie and 0 otherwise. This representation is crucial because it allows machine learning models to understand the presence or absence of specific genres or keywords without assuming any ordinal relationship between them. It also preserves the information about multiple categories being present at the same time, which can be vital for understanding complex relationships between features and the target variable (e.g., revenue). Using this encoding technique ensures that our models can effectively use these categorical features to make better predictions. You can refer to [How to Perform One-Hot Encoding For Multi Categorical Variables](https://www.analyticsvidhya.com/blog/2021/05/how-to-perform-one-hot-encoding-for-multi-categorical-variables/) for details.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- For the genres attribute, the data is initially in the form of a string representing a dictionary. Each dictionary contains an ID and the name of the genre. The same approach applies to the keywords column. See details below"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>genres</th>\n",
       "      <th>keywords</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>[{\"id\": 12, \"name\": \"Adventure\"}, {\"id\": 14, \"...</td>\n",
       "      <td>[{\"id\": 616, \"name\": \"witch\"}, {\"id\": 1441, \"n...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>[{\"id\": 14, \"name\": \"Fantasy\"}, {\"id\": 28, \"na...</td>\n",
       "      <td>[{\"id\": 1321, \"name\": \"gold\"}, {\"id\": 4668, \"n...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>[{\"id\": 12, \"name\": \"Adventure\"}, {\"id\": 14, \"...</td>\n",
       "      <td>[{\"id\": 911, \"name\": \"exotic island\"}, {\"id\": ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>[{\"id\": 878, \"name\": \"Science Fiction\"}, {\"id\"...</td>\n",
       "      <td>[{\"id\": 836, \"name\": \"resistance\"}, {\"id\": 445...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>[{\"id\": 53, \"name\": \"Thriller\"}, {\"id\": 9648, ...</td>\n",
       "      <td>[{\"id\": 90, \"name\": \"paris\"}, {\"id\": 113, \"nam...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4601</th>\n",
       "      <td>[{\"id\": 28, \"name\": \"Action\"}, {\"id\": 80, \"nam...</td>\n",
       "      <td>[{\"id\": 5616, \"name\": \"united states\\u2013mexi...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4602</th>\n",
       "      <td>[{\"id\": 35, \"name\": \"Comedy\"}, {\"id\": 10749, \"...</td>\n",
       "      <td>[]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4603</th>\n",
       "      <td>[{\"id\": 35, \"name\": \"Comedy\"}, {\"id\": 18, \"nam...</td>\n",
       "      <td>[{\"id\": 248, \"name\": \"date\"}, {\"id\": 699, \"nam...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4604</th>\n",
       "      <td>[]</td>\n",
       "      <td>[]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4605</th>\n",
       "      <td>[{\"id\": 99, \"name\": \"Documentary\"}]</td>\n",
       "      <td>[{\"id\": 1523, \"name\": \"obsession\"}, {\"id\": 224...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>4606 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                 genres  \\\n",
       "0     [{\"id\": 12, \"name\": \"Adventure\"}, {\"id\": 14, \"...   \n",
       "1     [{\"id\": 14, \"name\": \"Fantasy\"}, {\"id\": 28, \"na...   \n",
       "2     [{\"id\": 12, \"name\": \"Adventure\"}, {\"id\": 14, \"...   \n",
       "3     [{\"id\": 878, \"name\": \"Science Fiction\"}, {\"id\"...   \n",
       "4     [{\"id\": 53, \"name\": \"Thriller\"}, {\"id\": 9648, ...   \n",
       "...                                                 ...   \n",
       "4601  [{\"id\": 28, \"name\": \"Action\"}, {\"id\": 80, \"nam...   \n",
       "4602  [{\"id\": 35, \"name\": \"Comedy\"}, {\"id\": 10749, \"...   \n",
       "4603  [{\"id\": 35, \"name\": \"Comedy\"}, {\"id\": 18, \"nam...   \n",
       "4604                                                 []   \n",
       "4605                [{\"id\": 99, \"name\": \"Documentary\"}]   \n",
       "\n",
       "                                               keywords  \n",
       "0     [{\"id\": 616, \"name\": \"witch\"}, {\"id\": 1441, \"n...  \n",
       "1     [{\"id\": 1321, \"name\": \"gold\"}, {\"id\": 4668, \"n...  \n",
       "2     [{\"id\": 911, \"name\": \"exotic island\"}, {\"id\": ...  \n",
       "3     [{\"id\": 836, \"name\": \"resistance\"}, {\"id\": 445...  \n",
       "4     [{\"id\": 90, \"name\": \"paris\"}, {\"id\": 113, \"nam...  \n",
       "...                                                 ...  \n",
       "4601  [{\"id\": 5616, \"name\": \"united states\\u2013mexi...  \n",
       "4602                                                 []  \n",
       "4603  [{\"id\": 248, \"name\": \"date\"}, {\"id\": 699, \"nam...  \n",
       "4604                                                 []  \n",
       "4605  [{\"id\": 1523, \"name\": \"obsession\"}, {\"id\": 224...  \n",
       "\n",
       "[4606 rows x 2 columns]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_movies[['genres','keywords']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- To achieve this, we will create a lookup table that maps each genre or keyword to a unique numerical value, which will then be used to encode the genres and keywords for each movie.\n",
    "- Below is the example code of multi one-hot encoding for the genres attribute"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "from sklearn.cluster import KMeans\n",
    "import warnings\n",
    "\n",
    "warnings.simplefilter(action='ignore')\n",
    "\n",
    "# Extract all unique genres and keywords\n",
    "all_genres = set()\n",
    "all_keywords = set()\n",
    "\n",
    "for i in range(data_movies.shape[0]):\n",
    "    movie = data_movies.iloc[i]\n",
    "    genres = eval(movie['genres'])\n",
    "    for genre in genres:\n",
    "        all_genres.add(genre['name'])\n",
    "\n",
    "# Create a lookup table\n",
    "genre_mapping = {genre: idx for idx, genre in enumerate(all_genres)}\n",
    "\n",
    "# Encode each sample\n",
    "def encode_movie(movie):\n",
    "    genre_vector = np.zeros(len(genre_mapping))\n",
    "    genres = eval(movie['genres'])\n",
    "    for genre in genres:\n",
    "        # One-hot encoding for genres\n",
    "        genre_vector[genre_mapping[genre['name']]] = 1  \n",
    "    \n",
    "    return genre_vector\n",
    "\n",
    "# Encode all movies\n",
    "data_movies['genre_encoding'] = None\n",
    "\n",
    "for i in range(data_movies.shape[0]):\n",
    "    data_movies['genre_encoding'].iloc[i] = encode_movie(data_movies.iloc[i])\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Show thw genre encoding"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0       [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...\n",
       "1       [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, ...\n",
       "2       [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...\n",
       "3       [0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...\n",
       "4       [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...\n",
       "                              ...                        \n",
       "4601    [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, ...\n",
       "4602    [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...\n",
       "4603    [0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, ...\n",
       "4604    [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...\n",
       "4605    [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, ...\n",
       "Name: genre_encoding, Length: 4606, dtype: object"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data_movies['genre_encoding'] "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Your task is to do conversion on the feature of **keywords** referencing to the provided code above\n",
    "> `movie['keywords']`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Implemente keywords feature conversion, write your code here\n",
    "# Extract all unique keywords\n",
    "for i in range(data_movies.shape[0]):\n",
    "    movie = data_movies.iloc[i]\n",
    "    keywords = eval(movie['keywords'])\n",
    "    for keyword in keywords:\n",
    "        all_keywords.add(keyword['name'])\n",
    "\n",
    "# Create a lookup table\n",
    "keyword_mapping = {keyword: idx for idx, keyword in enumerate(all_keywords)}\n",
    "\n",
    "# Encode each sample\n",
    "def encode_keywords(movie):\n",
    "    keyword_vector = np.zeros(len(keyword_mapping))\n",
    "    keywords = eval(movie['keywords'])\n",
    "    for keyword in keywords:\n",
    "        # One-hot encoding for keywords\n",
    "        keyword_vector[keyword_mapping[keyword['name']]] = 1  \n",
    "    \n",
    "    return keyword_vector\n",
    "\n",
    "# Encode all movies\n",
    "data_movies['keyword_encoding'] = None\n",
    "\n",
    "for i in range(data_movies.shape[0]):\n",
    "    data_movies['keyword_encoding'].iloc[i] = encode_keywords(data_movies.iloc[i])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Task 2.2: Feature Alignment and Enhancement (15%)\n",
    "\n",
    "### Feauture Alignment\n",
    "After the feature conversion, the one-hot encoding of genres introduces an extra dimension in the DataFrame. To address this, we need to flatten the one-hot encoding.\n",
    "\n",
    "- Your task is to flatten the `genre_encoding` column to ensure each genre feature is represented in a single dimension rather than in a nested array. The flattening makes it easier for machine learning models to process the data effectively in the bonus task\n",
    "\n",
    "- Hints: you could refer to [np.flatten()](https://www.geeksforgeeks.org/numpy-ndarray-flatten-function-python/)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>budget</th>\n",
       "      <th>genres</th>\n",
       "      <th>homepage</th>\n",
       "      <th>id</th>\n",
       "      <th>keywords</th>\n",
       "      <th>original_language</th>\n",
       "      <th>original_title</th>\n",
       "      <th>overview</th>\n",
       "      <th>popularity</th>\n",
       "      <th>production_companies</th>\n",
       "      <th>...</th>\n",
       "      <th>10</th>\n",
       "      <th>11</th>\n",
       "      <th>12</th>\n",
       "      <th>13</th>\n",
       "      <th>14</th>\n",
       "      <th>15</th>\n",
       "      <th>16</th>\n",
       "      <th>17</th>\n",
       "      <th>18</th>\n",
       "      <th>19</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>125000000</td>\n",
       "      <td>[{\"id\": 12, \"name\": \"Adventure\"}, {\"id\": 14, \"...</td>\n",
       "      <td>http://harrypotter.warnerbros.com/harrypottera...</td>\n",
       "      <td>671</td>\n",
       "      <td>[{\"id\": 616, \"name\": \"witch\"}, {\"id\": 1441, \"n...</td>\n",
       "      <td>en</td>\n",
       "      <td>Harry Potter and the Philosopher's Stone</td>\n",
       "      <td>Harry Potter has lived under the stairs at his...</td>\n",
       "      <td>109.984351</td>\n",
       "      <td>[{\"name\": \"1492 Pictures\", \"id\": 436}, {\"name\"...</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>130000000</td>\n",
       "      <td>[{\"id\": 14, \"name\": \"Fantasy\"}, {\"id\": 28, \"na...</td>\n",
       "      <td>http://www.ripd.com/</td>\n",
       "      <td>49524</td>\n",
       "      <td>[{\"id\": 1321, \"name\": \"gold\"}, {\"id\": 4668, \"n...</td>\n",
       "      <td>en</td>\n",
       "      <td>R.I.P.D.</td>\n",
       "      <td>A recently slain cop joins a team of undead po...</td>\n",
       "      <td>39.448066</td>\n",
       "      <td>[{\"name\": \"Universal Pictures\", \"id\": 33}, {\"n...</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>140000000</td>\n",
       "      <td>[{\"id\": 12, \"name\": \"Adventure\"}, {\"id\": 14, \"...</td>\n",
       "      <td>http://disney.go.com/disneyvideos/liveaction/p...</td>\n",
       "      <td>22</td>\n",
       "      <td>[{\"id\": 911, \"name\": \"exotic island\"}, {\"id\": ...</td>\n",
       "      <td>en</td>\n",
       "      <td>Pirates of the Caribbean: The Curse of the Bla...</td>\n",
       "      <td>Jack Sparrow, a freewheeling 17th-century pira...</td>\n",
       "      <td>271.972889</td>\n",
       "      <td>[{\"name\": \"Walt Disney Pictures\", \"id\": 2}, {\"...</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>125000000</td>\n",
       "      <td>[{\"id\": 878, \"name\": \"Science Fiction\"}, {\"id\"...</td>\n",
       "      <td>http://www.thehungergames.movie/</td>\n",
       "      <td>131631</td>\n",
       "      <td>[{\"id\": 836, \"name\": \"resistance\"}, {\"id\": 445...</td>\n",
       "      <td>en</td>\n",
       "      <td>The Hunger Games: Mockingjay - Part 1</td>\n",
       "      <td>Katniss Everdeen reluctantly becomes the symbo...</td>\n",
       "      <td>206.227151</td>\n",
       "      <td>[{\"name\": \"Lionsgate\", \"id\": 1632}, {\"name\": \"...</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>125000000</td>\n",
       "      <td>[{\"id\": 53, \"name\": \"Thriller\"}, {\"id\": 9648, ...</td>\n",
       "      <td>http://www.sonypictures.com/homevideo/thedavin...</td>\n",
       "      <td>591</td>\n",
       "      <td>[{\"id\": 90, \"name\": \"paris\"}, {\"id\": 113, \"nam...</td>\n",
       "      <td>en</td>\n",
       "      <td>The Da Vinci Code</td>\n",
       "      <td>When the curator of the Louvre is found murder...</td>\n",
       "      <td>45.313197</td>\n",
       "      <td>[{\"name\": \"Columbia Pictures\", \"id\": 5}, {\"nam...</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 43 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      budget                                             genres  \\\n",
       "0  125000000  [{\"id\": 12, \"name\": \"Adventure\"}, {\"id\": 14, \"...   \n",
       "1  130000000  [{\"id\": 14, \"name\": \"Fantasy\"}, {\"id\": 28, \"na...   \n",
       "2  140000000  [{\"id\": 12, \"name\": \"Adventure\"}, {\"id\": 14, \"...   \n",
       "3  125000000  [{\"id\": 878, \"name\": \"Science Fiction\"}, {\"id\"...   \n",
       "4  125000000  [{\"id\": 53, \"name\": \"Thriller\"}, {\"id\": 9648, ...   \n",
       "\n",
       "                                            homepage      id  \\\n",
       "0  http://harrypotter.warnerbros.com/harrypottera...     671   \n",
       "1                               http://www.ripd.com/   49524   \n",
       "2  http://disney.go.com/disneyvideos/liveaction/p...      22   \n",
       "3                   http://www.thehungergames.movie/  131631   \n",
       "4  http://www.sonypictures.com/homevideo/thedavin...     591   \n",
       "\n",
       "                                            keywords original_language  \\\n",
       "0  [{\"id\": 616, \"name\": \"witch\"}, {\"id\": 1441, \"n...                en   \n",
       "1  [{\"id\": 1321, \"name\": \"gold\"}, {\"id\": 4668, \"n...                en   \n",
       "2  [{\"id\": 911, \"name\": \"exotic island\"}, {\"id\": ...                en   \n",
       "3  [{\"id\": 836, \"name\": \"resistance\"}, {\"id\": 445...                en   \n",
       "4  [{\"id\": 90, \"name\": \"paris\"}, {\"id\": 113, \"nam...                en   \n",
       "\n",
       "                                      original_title  \\\n",
       "0           Harry Potter and the Philosopher's Stone   \n",
       "1                                           R.I.P.D.   \n",
       "2  Pirates of the Caribbean: The Curse of the Bla...   \n",
       "3              The Hunger Games: Mockingjay - Part 1   \n",
       "4                                  The Da Vinci Code   \n",
       "\n",
       "                                            overview  popularity  \\\n",
       "0  Harry Potter has lived under the stairs at his...  109.984351   \n",
       "1  A recently slain cop joins a team of undead po...   39.448066   \n",
       "2  Jack Sparrow, a freewheeling 17th-century pira...  271.972889   \n",
       "3  Katniss Everdeen reluctantly becomes the symbo...  206.227151   \n",
       "4  When the curator of the Louvre is found murder...   45.313197   \n",
       "\n",
       "                                production_companies  ...   10   11   12   13  \\\n",
       "0  [{\"name\": \"1492 Pictures\", \"id\": 436}, {\"name\"...  ...  0.0  0.0  1.0  0.0   \n",
       "1  [{\"name\": \"Universal Pictures\", \"id\": 33}, {\"n...  ...  0.0  1.0  0.0  0.0   \n",
       "2  [{\"name\": \"Walt Disney Pictures\", \"id\": 2}, {\"...  ...  0.0  0.0  0.0  0.0   \n",
       "3  [{\"name\": \"Lionsgate\", \"id\": 1632}, {\"name\": \"...  ...  0.0  0.0  0.0  0.0   \n",
       "4  [{\"name\": \"Columbia Pictures\", \"id\": 5}, {\"nam...  ...  0.0  0.0  0.0  0.0   \n",
       "\n",
       "    14   15   16   17   18   19  \n",
       "0  0.0  0.0  0.0  1.0  0.0  0.0  \n",
       "1  0.0  0.0  1.0  1.0  0.0  0.0  \n",
       "2  0.0  0.0  1.0  1.0  0.0  0.0  \n",
       "3  0.0  1.0  0.0  0.0  1.0  0.0  \n",
       "4  0.0  1.0  0.0  0.0  0.0  0.0  \n",
       "\n",
       "[5 rows x 43 columns]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "# Implement the lambda function to flatten the genre encoding\n",
    "data_movies['genre_encoding_flattened'] = data_movies['genre_encoding'].apply(lambda x: np.array(x).flatten())\n",
    "\n",
    "data_movies_flattened = pd.DataFrame(data_movies['genre_encoding_flattened'].tolist(), index=data_movies.index)\n",
    "\n",
    "data_movies = pd.concat([data_movies, data_movies_flattened], axis=1)\n",
    "data_movies.drop('genre_encoding', axis=1, inplace=True)\n",
    "\n",
    "data_movies.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Feature Enhancement\n",
    "- We can use existing features to generate new feature dimensions, such as budget and revenue: these two fields directly impact box office performance. We can try constructing ROI (Return on Investment), defined as ROI = revenue / budget, to measure investment effectiveness and thereby predict box office performance more accurately."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0       1.249889e+09\n",
       "1       7.587508e+07\n",
       "2       7.485843e+08\n",
       "3       9.626883e+08\n",
       "4       9.828102e+08\n",
       "            ...     \n",
       "4601    1.484305e+09\n",
       "4602    0.000000e+00\n",
       "4603    4.277051e+11\n",
       "4604    4.277051e+11\n",
       "4605    4.277051e+11\n",
       "Name: ROI, Length: 4606, dtype: float64"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Implement the lambda function to calculate the ROI\n",
    "def ROI(data_movies):\n",
    "    # Calculate ROI as revenue / budget if budget > 0, else np.nan\n",
    "    data_movies['ROI'] = data_movies.apply(lambda row: row['revenue'] / row['budget'] if row['budget'] > 0 else np.nan, axis=1)\n",
    "    # Replace infinite values with NaN\n",
    "    data_movies['ROI'].replace([np.inf, -np.inf], np.nan, inplace=True)\n",
    "    # Fill NaN values with the mean ROI\n",
    "    data_movies['ROI'].fillna(data_movies['ROI'].mean(), inplace=True)\n",
    "    return data_movies\n",
    "\n",
    "data_movies = ROI(data_movies)\n",
    "data_movies[\"ROI\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Task 2.3: Feature normalization (15%)\n",
    "\n",
    "- Due to the varying scales of the features during computation, features with higher scales may dominate others. Therefore, normalization is necessary to ensure that all features are on the same scale for fair comparison and analysis.\n",
    "\n",
    "- Normalization is to map the feature values scaled to range [0, 1]. so that the minimum value of each feature corresponds to 0, the maximum value corresponds to 1, and other values fall accordingly within this range.\n",
    "\n",
    "- In this task you are requried to implement the [min-max](https://medium.com/@abhi1achiever/min-max-normalization-db1f515b08b4) normalization function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    budget\n",
      "0  0.78125\n",
      "1  0.81250\n",
      "2  0.87500\n",
      "3  0.78125\n",
      "4  0.78125\n"
     ]
    }
   ],
   "source": [
    "# Implement the min-max normalize function\n",
    "def normalize_features(features):\n",
    "    min_vals = features.min(axis=0)\n",
    "    max_vals = features.max(axis=0)\n",
    "    # Write your code here\n",
    "    normalized_features = (features - min_vals) / (max_vals - min_vals)\n",
    "    return normalized_features\n",
    "\n",
    "numerical_features = ['budget']\n",
    "data_movies[numerical_features] = normalize_features(data_movies[numerical_features])\n",
    "data_normalized = data_movies[numerical_features].head()\n",
    "print(data_normalized)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- There are other normalization methods for your reference in the bonus task ([Z-score Normalization](https://www.statology.org/z-score-normalization/) and [Robust Scaling](https://scikit-learn.org/dev/modules/generated/sklearn.preprocessing.RobustScaler.html))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler, RobustScaler\n",
    "# Method 2: Standardization (Z-score Normalization)\n",
    "scaler_standard = StandardScaler()\n",
    "data_standard_normalized = data_movies.copy()\n",
    "data_standard_normalized[numerical_features] = scaler_standard.fit_transform(data_movies[numerical_features])\n",
    "\n",
    "# Method 3: Robust Scaling (less sensitive to outliers)\n",
    "scaler_robust = RobustScaler()\n",
    "data_robust_normalized = data_movies.copy()\n",
    "data_robust_normalized[numerical_features] = scaler_robust.fit_transform(data_movies[numerical_features])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Bonus Task: Movie Box Office Prediction (20%)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this task, we will implement a movie box office prediction system for movie revenue prediction. \n",
    "You are free to choose different  numerical features like popularity, vote_average, and vote_count, as well as genre and keyword encodings as the input feature matrix. We will provide the basic prediction model as follows:\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Basic Model: XGBoost Custom Model Explanation\n",
    "The `XGBoostCustom` class is an implementation of the gradient boosting algorithm that focuses on building decision trees sequentially, where each tree attempts to correct the errors of the previous one. Let's break down the key components of this class:\n",
    "\n",
    "##### Key Components:\n",
    "1. **Initialization (`__init__` method)**:\n",
    "   - The model has several hyperparameters like `n_estimators` (number of boosting rounds), `learning_rate` (contribution of each tree), `max_depth` (depth of each tree), and `lambda_` (regularization term).\n",
    "   - A list `trees` is used to store the individual decision trees built during the boosting process.\n",
    "\n",
    "2. **Training (`fit` method)**:\n",
    "   - The initial prediction is set to the mean of the target variable, which is used to make a starting guess for each sample.\n",
    "   - For each boosting round, the model computes gradients (first derivative) and Hessians (second derivative) to determine the direction and magnitude for error correction.\n",
    "   - A decision tree is built based on these gradients and Hessians, and the resulting tree is appended to the list of trees.\n",
    "   - The predictions are updated after each tree is added.\n",
    "\n",
    "3. **Prediction (`predict` method)**:\n",
    "   - The final prediction starts with the base prediction (mean of the target variable).\n",
    "   - Predictions from each tree are added sequentially, scaled by the `learning_rate`.\n",
    "\n",
    "4. **Gradient and Hessian Calculations (`_gradient` and `_hessian` methods)**:\n",
    "   - The gradient represents the direction of the error and is computed as the difference between the predicted value and the actual target (`y_pred - y`).\n",
    "   - The Hessian represents the rate of change of the gradient and is constant in this case (`1`) for mean squared error.\n",
    "\n",
    "5. **Building Decision Trees (`_build_tree` method)**:\n",
    "   - Trees are built recursively. The method stops if the maximum depth is reached or there are too few samples to split.\n",
    "   - It calculates the optimal split based on feature thresholds, maximizing the information gain.\n",
    "   - If no good split is found, the node becomes a leaf, and its value is determined by the gradient and Hessian.\n",
    "\n",
    "6. **Gain Calculation (`_gain` method)**:\n",
    "   - The gain calculation helps to determine the best split by maximizing the reduction in error.\n",
    "   - It uses the sum of gradients and Hessians for the left and right splits to compute the gain.\n",
    "\n",
    "7. **Tree Prediction (`_predict_tree` method)**:\n",
    "   - This method is used to recursively traverse a decision tree and make predictions.\n",
    "   - If a node is a leaf, the prediction is simply the value of that leaf.\n",
    "   - If it's not a leaf, the method checks the feature value against the threshold and continues to either the left or right child node.\n",
    "\n",
    "### Insights for Students:\n",
    "- **Gradient Boosting Principle**: The goal of gradient boosting is to sequentially build trees where each tree corrects the residual errors of the previous trees. This enables the model to learn complex functions and reduce error iteratively.\n",
    "- **Regularization**: The `lambda_` parameter helps in controlling the complexity of the model to prevent overfitting, especially when the dataset has high variance.\n",
    "- **Learning Rate**: It controls the contribution of each tree to the overall model, which is useful for stabilizing training and avoiding overfitting.\n",
    "- **Gradient and Hessian**: These derivatives guide the model in the direction of reducing the loss function, enabling it to effectively improve prediction accuracy.\n",
    "\n",
    "This custom implementation simplifies the core concepts behind XGBoost, making it easier to understand how boosting works step by step. By building trees based on gradients and adjusting predictions iteratively, this model mimics the core behavior of more advanced boosting frameworks.\n",
    "\n",
    "For details, you can refer to: https://xgboost.readthedocs.io/en/latest/tutorials/index.html"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "class XGBoostCustom:\n",
    "    def __init__(self, n_estimators=100, learning_rate=0.1, max_depth=3, lambda_=1):\n",
    "        # Initialize model parameters\n",
    "        self.n_estimators = n_estimators\n",
    "        self.learning_rate = learning_rate\n",
    "        self.max_depth = max_depth\n",
    "        self.lambda_ = lambda_\n",
    "        # List to store trees for boosting\n",
    "        self.trees = []  \n",
    "\n",
    "    def fit(self, X, y):\n",
    "        # Initialize predictions with the mean value of the target\n",
    "        self.base_prediction = np.mean(y)\n",
    "        y_pred = np.full(y.shape, self.base_prediction)\n",
    "\n",
    "        # Train multiple trees as specified by n_estimators\n",
    "        for _ in range(self.n_estimators):\n",
    "            # Calculate gradients and Hessians\n",
    "            gradient = self._gradient(y, y_pred)\n",
    "            hessian = self._hessian(y, y_pred)\n",
    "\n",
    "            # Build a new decision tree based on gradient and Hessian\n",
    "            tree = self._build_tree(X, gradient, hessian, depth=0)\n",
    "            self.trees.append(tree)\n",
    "\n",
    "            # Update predictions with the newly trained tree\n",
    "            y_pred += self.learning_rate * self._predict_tree(tree, X)\n",
    "\n",
    "    def predict(self, X):\n",
    "        # Start predictions with the base prediction\n",
    "        y_pred = np.full((X.shape[0],), self.base_prediction)\n",
    "        # Add predictions from each tree\n",
    "        for tree in self.trees:\n",
    "            y_pred += self.learning_rate * self._predict_tree(tree, X)\n",
    "        return y_pred\n",
    "\n",
    "    def _gradient(self, y, y_pred):\n",
    "        # Calculate the first derivative (gradient) of the mean squared error\n",
    "        return y_pred - y\n",
    "\n",
    "    def _hessian(self, y, y_pred):\n",
    "        # The second derivative (Hessian) for mean squared error is constant (1)\n",
    "        return np.ones_like(y)\n",
    "\n",
    "    def _build_tree(self, X, gradient, hessian, depth):\n",
    "        # Stop recursion if max depth is reached or if there's no data to split\n",
    "        if depth == self.max_depth or len(gradient) < 2:\n",
    "            # Leaf node value calculated as sum of gradients divided by sum of Hessians + lambda\n",
    "            leaf_value = -np.sum(gradient) / (np.sum(hessian) + self.lambda_)\n",
    "            return {\"leaf_value\": leaf_value}\n",
    "\n",
    "        # Initialize best split parameters\n",
    "        best_split = None\n",
    "        best_gain = -float(\"inf\")\n",
    "        m, n = X.shape\n",
    "\n",
    "        # Try each feature and threshold to find the best split\n",
    "        for feature in range(n):\n",
    "            thresholds = np.unique(X[:, feature])\n",
    "            for threshold in thresholds:\n",
    "                # Split data into left and right nodes\n",
    "                left_mask = X[:, feature] <= threshold\n",
    "                right_mask = X[:, feature] > threshold\n",
    "\n",
    "                # Skip if one of the nodes is empty\n",
    "                if np.sum(left_mask) == 0 or np.sum(right_mask) == 0:\n",
    "                    continue\n",
    "\n",
    "                # Calculate gain for this split\n",
    "                gain = self._gain(gradient, hessian, left_mask, right_mask)\n",
    "                if gain > best_gain:\n",
    "                    best_gain = gain\n",
    "                    best_split = {\"feature\": feature, \"threshold\": threshold, \"left\": left_mask, \"right\": right_mask}\n",
    "\n",
    "        # If no good split was found, make this node a leaf\n",
    "        if best_split is None:\n",
    "            leaf_value = -np.sum(gradient) / (np.sum(hessian) + self.lambda_)\n",
    "            return {\"leaf_value\": leaf_value}\n",
    "\n",
    "        # Recursively build the left and right branches of the tree\n",
    "        left_tree = self._build_tree(X[best_split[\"left\"]], gradient[best_split[\"left\"]], hessian[best_split[\"left\"]], depth + 1)\n",
    "        right_tree = self._build_tree(X[best_split[\"right\"]], gradient[best_split[\"right\"]], hessian[best_split[\"right\"]], depth + 1)\n",
    "        return {\"feature\": best_split[\"feature\"], \"threshold\": best_split[\"threshold\"], \"left\": left_tree, \"right\": right_tree}\n",
    "\n",
    "    def _gain(self, gradient, hessian, left_mask, right_mask):\n",
    "        ###Your code here\n",
    "        # Calculate the gain from splitting the node\n",
    "        G_L, G_R = np.sum(gradient[left_mask]), np.sum(gradient[right_mask])\n",
    "        H_L, H_R = np.sum(hessian[left_mask]), np.sum(hessian[right_mask])\n",
    "        \n",
    "        # Gain = 0.5 * [(G_L^2 / (H_L + lambda)) + (G_R^2 / (H_R + lambda)) - ((G_L + G_R)^2 / (H_L + H_R + lambda))]\n",
    "        gain = 0.5 * ((G_L ** 2) / (H_L + self.lambda_) + (G_R ** 2) / (H_R + self.lambda_) -\n",
    "                      (G_L + G_R) ** 2 / (H_L + H_R + self.lambda_))\n",
    "        return gain\n",
    "\n",
    "    def _predict_tree(self, tree, X):\n",
    "        # Recursive prediction for a single tree\n",
    "        if \"leaf_value\" in tree:\n",
    "            return np.full(X.shape[0], tree[\"leaf_value\"])\n",
    "                           \n",
    "        # Identify the left and right nodes based on feature threshold\n",
    "        feature, threshold = tree[\"feature\"], tree[\"threshold\"]\n",
    "        left_mask = X[:, feature] <= threshold\n",
    "        right_mask = X[:, feature] > threshold\n",
    "\n",
    "        # Predict for left and right branches\n",
    "        y_pred = np.zeros(X.shape[0])\n",
    "        y_pred[left_mask] = self._predict_tree(tree[\"left\"], X[left_mask])\n",
    "        y_pred[right_mask] = self._predict_tree(tree[\"right\"], X[right_mask])\n",
    "        return y_pred"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Your task is to enhance the accuracy of your prediction model using the following methods:\n",
    "- You could include different features by exploring the dataset in Task 1\n",
    "    > `selected_feature =  ['budget', 'genre_encoding', ...]`\n",
    "    - Note that the feature of `genre_encoding` is already encoded by Task 2.1\n",
    "\n",
    "- You could perform feature engineering/enhancement in Task 2.2\n",
    "    > e.g. `def One-hot encoding(), def ROI() ...`\n",
    "\n",
    "- You could choose different normalization methods in Task 2.3\n",
    "    > `X_train = normalize_features(X_train)`\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Data process and training \n",
    "\n",
    "from sklearn.metrics import mean_squared_error\n",
    "import torch\n",
    "\n",
    "# Ensure genre_encoding is created\n",
    "all_genres = set()\n",
    "for i in range(data_movies.shape[0]):\n",
    "\tmovie = data_movies.iloc[i]\n",
    "\tgenres = eval(movie['genres'])\n",
    "\tfor genre in genres:\n",
    "\t\tall_genres.add(genre['name'])\n",
    "\n",
    "genre_mapping = {genre: idx for idx, genre in enumerate(all_genres)}\n",
    "\n",
    "def encode_movie(movie):\n",
    "\tgenre_vector = np.zeros(len(genre_mapping))\n",
    "\tgenres = eval(movie['genres'])\n",
    "\tfor genre in genres:\n",
    "\t\tgenre_vector[genre_mapping[genre['name']]] = 1  \n",
    "\treturn genre_vector\n",
    "\n",
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "\n",
    "data_movies['genre_encoding'] = None\n",
    "for i in range(data_movies.shape[0]):\n",
    "\tdata_movies['genre_encoding'].iloc[i] = encode_movie(data_movies.iloc[i])\n",
    "\n",
    "# Flatten the genre_encoding column\n",
    "data_movies['genre_encoding_flattened'] = data_movies['genre_encoding'].apply(lambda x: np.array(x).flatten())\n",
    "data_movies_flattened = pd.DataFrame(data_movies['genre_encoding_flattened'].tolist(), index=data_movies.index)\n",
    "data_movies = pd.concat([data_movies, data_movies_flattened], axis=1)\n",
    "data_movies.drop('genre_encoding', axis=1, inplace=True)\n",
    "\n",
    "# You can select different features depending on related attribute (Task 1) \n",
    "# and use different feature engineering methods to train the model (Task 2.2， e.g. 'release_data'  is enhanced features)\n",
    "\n",
    "selected_feature =  ['budget'] + list(data_movies_flattened.columns)\n",
    "target_feature = 'revenue'\n",
    "\n",
    "# Adding ROI feature to selected features\n",
    "selected_feature.append('ROI')\n",
    "\n",
    "# Calculate ROI for training data\n",
    "data_movies = ROI(data_movies)\n",
    "\n",
    "# Update X_train with the new feature\n",
    "X_train = data_movies[selected_feature].values\n",
    "Y_train = data_movies[target_feature].values\n",
    "\n",
    "# You can switch between different normalization methods (Task 2.3)\n",
    "X_train = normalize_features(X_train)\n",
    "\n",
    "#, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "data_test = pd.read_csv('data/tmdb_5000_movies_test.csv')\n",
    "process_release_date(data_test)\n",
    "\n",
    "# Check if 'revenue' column exists in the test data\n",
    "if 'revenue' in data_test.columns:\n",
    "\tdata_test = ROI(data_test)\n",
    "else:\n",
    "\t# If 'revenue' column is missing, create a dummy 'revenue' column with NaN values\n",
    "\tdata_test['revenue'] = np.nan\n",
    "\tdata_test = ROI(data_test)\n",
    "\t# Drop the dummy 'revenue' column after calculating ROI\n",
    "\tdata_test.drop('revenue', axis=1, inplace=True)\n",
    "\n",
    "# Flatten the genre_encoding column for test data\n",
    "data_test['genre_encoding'] = None\n",
    "for i in range(data_test.shape[0]):\n",
    "\tdata_test['genre_encoding'].iloc[i] = encode_movie(data_test.iloc[i])\n",
    "data_test['genre_encoding_flattened'] = data_test['genre_encoding'].apply(lambda x: np.array(x).flatten())\n",
    "data_test_flattened = pd.DataFrame(data_test['genre_encoding_flattened'].tolist(), index=data_test.index)\n",
    "data_test = pd.concat([data_test, data_test_flattened], axis=1)\n",
    "data_test.drop('genre_encoding', axis=1, inplace=True)\n",
    "\n",
    "X_test = data_test[selected_feature].values\n",
    "X_test = normalize_features(X_test)\n",
    "\n",
    "# Initialize and train the model\n",
    "model = XGBoostCustom(n_estimators=100, learning_rate=0.1, max_depth=3)\n",
    "# Initialize and train the model\n",
    "model = XGBoostCustom(n_estimators=100, learning_rate=0.1, max_depth=3)\n",
    "model.fit(X_train, Y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[62786697.47546678 62786697.47546678 62786697.47546678 63045234.75453932\n",
      " 62786697.47546678 62786697.47546678 63045234.75453932 62786697.47546678\n",
      " 62786697.47546678 62786697.47546678 62786697.47546678 62786697.47546678\n",
      " 62786697.47546678 62786697.47546678 62786697.47546678 62786697.47546678\n",
      " 62786697.47546678 62786697.47546678 63045234.75453932 62786697.47546678\n",
      " 62786697.47546678 62786697.47546678 62786697.47546678 62956409.76375481\n",
      " 62786697.47546678 63045234.75453932 62786697.47546678 62786697.47546678\n",
      " 62956409.76375481 62786697.47546678 62786697.47546678 62786697.47546678\n",
      " 62786697.47546678 62786697.47546678 63045234.75453932 62956409.76375481\n",
      " 62786697.47546678 62786697.47546678 62786697.47546678 62956409.76375481\n",
      " 62786697.47546678 62786697.47546678 63045234.75453932 63045234.75453932\n",
      " 63045234.75453932 63045234.75453932 62786697.47546678 62786697.47546678\n",
      " 63045234.75453932 63031706.50692671 62956409.76375481 62956409.76375481\n",
      " 62786697.47546678 62786697.47546678 62956409.76375481 62786697.47546678\n",
      " 62786697.47546678 63214947.04282735 63214947.04282735 62786697.47546678\n",
      " 63045234.75453932 62956409.76375481 62956409.76375481 63214947.04282735\n",
      " 63045234.75453932 62956409.76375481 62956409.76375481 62956409.76375481\n",
      " 62956409.76375481 62956409.76375481 62956409.76375481 62956409.76375481\n",
      " 63214947.04282735 63214947.04282735 62956409.76375481 62956409.76375481\n",
      " 63214947.04282735 62956409.76375481 62786697.47546678 62956409.76375481\n",
      " 62956409.76375481 63214947.04282735 51163160.07276083 62956409.76375481\n",
      " 62956409.76375481 62956409.76375481 62786697.47546678 62956409.76375481\n",
      " 62956409.76375481 62956409.76375481 62956409.76375481 62956409.76375481\n",
      " 63045234.75453932 62956409.76375481 62956409.76375481 62956409.76375481\n",
      " 40298982.58598208 62786697.47546678 49628186.0459887  63214947.04282735\n",
      " 62956409.76375481 62956409.76375481 62956409.76375481 62956409.76375481\n",
      " 63214947.04282735 62956409.76375481 62956409.76375481 62956409.76375481\n",
      " 62956409.76375481 63214947.04282735 62956409.76375481 62956409.76375481\n",
      " 62956409.76375481 62956409.76375481 63214947.04282735 63214947.04282735\n",
      " 62956409.76375481 63214947.04282735 63214947.04282735 63214947.04282735\n",
      " 62956409.76375481 62956409.76375481 62956409.76375481 62956409.76375481\n",
      " 62956409.76375481 62956409.76375481 62956409.76375481 63214947.04282735\n",
      " 62956409.76375481 62956409.76375481 62956409.76375481 62956409.76375481\n",
      " 63214947.04282735 62956409.76375481 63214947.04282735 62956409.76375481\n",
      " 63214947.04282735 62956409.76375481 62956409.76375481 63214947.04282735\n",
      " 62956409.76375481 62956409.76375481 62956409.76375481 62956409.76375481\n",
      " 62956409.76375481 63214947.04282735 62956409.76375481 63214947.04282735\n",
      " 62956409.76375481 62956409.76375481 62773169.22785417 62956409.76375481\n",
      " 62956409.76375481 63214947.04282735 63031706.50692671 63214947.04282735\n",
      " 62956409.76375481 62956409.76375481 63214947.04282735 62956409.76375481\n",
      " 63214947.04282735 63031706.50692671 63031706.50692671 62956409.76375481\n",
      " 63031706.50692671 62773169.22785417 62773169.22785417 62773169.22785417\n",
      " 62956409.76375481 62773169.22785417 62956409.76375481 62773169.22785417\n",
      " 63031706.50692671 62956409.76375481 62956409.76375481 62773169.22785417\n",
      " 63031706.50692671 62773169.22785417 62773169.22785417 63031706.50692671\n",
      " 62773169.22785417 62773169.22785417 62773169.22785417 63031706.50692671\n",
      " 62773169.22785417 62773169.22785417 62773169.22785417 63031706.50692671\n",
      " 62773169.22785417 62773169.22785417 62773169.22785417 63031706.50692671\n",
      " 62773169.22785417 63031706.50692671 62773169.22785417 63031706.50692671\n",
      " 62773169.22785417 63031706.50692671]\n"
     ]
    }
   ],
   "source": [
    "# Predict and evaluate\n",
    "y_pred = model.predict(X_test)\n",
    "print(y_pred)\n",
    "data_test['revenue'] =y_pred\n",
    "data_test['revenue']= data_test['revenue'].astype(int)\n",
    "selected_columns = data_test[['id', 'revenue']]\n",
    "selected_columns.to_csv('answer.csv', index=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Submit the prediction results 'answer.csv' to https://www.kaggle.com/t/8c4b735a6169400eabb25d7b07bd01ab\n",
    "\n",
    "- We will mark the results according to your prediction results.\n",
    "- Please use your school email to register and log in, we can obtain the student ID from the email.\n",
    "- Please keep this part of your code in this notebook, we will use it to validate your prediction results."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "cisc7021",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
